package code.c02_list.sqList;

import code.c02_list.sqList.SqListClass;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/9/11 20:30
 * @package code.c02_list.classwork.examples
 * @description 例 2.3 假设有一个字符顺序表L ，设计算法用于删除从序号i到k个元素，
 *              若删除成功，则返回true,否则返回false
 *
 */

public class Exam_2_3 {
    /**
     *
     *
     * 方法1 ：逐一删除元素
     *      在参数正确时，让 j 从 i 到 i+k-1 循环，每次循环调用Delete()删除序号为 i 的元素。
     * 分析：
     *      时间复杂度为 O(n ^ 2)
     *
     * @param L 字符顺序表 L
     * @param i 要删除的元素的第一个元素的序号
     * @param k 要删除元素的个数
     * @return 受否删除成功
     */
    public static boolean delete01(SqListClass<Character> L, int i, int k) {
        // 检查 被删除元素的序号是否正确
        if (i < 0 || k < 1 || i + k < 1 || i + k > L.size) {
            return false;
        }else {
            for (int j = 0; j < i + k - 1; j++) {
                L.delete(i);
            }
            return true;
        }
    }

    /**
     * 方法2 ：在参数正确时，直接将 a(i+k)~a(n-1)的所有的元素一次前移k个单位。
     *      直接采用覆盖的方法
     * 分析：
     *      时间复杂度为 O(n)
     * @param L 字符顺序表
     * @param i
     * @param k
     * @return
     */
    public static boolean delete02(SqListClass<Character> L, int i, int k) {
        if (i < 0 || k < 1 || i + k < 1 || i + k > L.size) {
            return false;
        }else {
            for (int j = i + k; j <L.size ; j++) {
                L.setElem(j - k,L.getElem(j));
            }
            L.setsize(L.size() - k);
            return true;
        }
    }
}
